package org.framework.common.ext.util;

import java.io.File;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.SQLExec;
import org.apache.tools.ant.types.EnumeratedAttribute;

/**
 * 执行SQL脚本 
 * <p>描述: </p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date 2016年9月21日 下午4:41:46
 * @version 1.0.2016
 */
public class AntSqlUtil {
	
	/**
	 * 执行SQL脚本.
	 * @param config
	 * @param script
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月22日 上午9:40:14
	 */
	public static void execute(final String config, final File script){
		// 获取SQL脚本执行器
		SQLExec exec = getExecutor(config, null);
		
		// 设置脚本文件
		exec.setSrc(script);

		// 执行脚本
		exec.execute();
	}
	
	/**
	 * 执行SQL脚本.
	 * @param config
	 * @param script
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月22日 上午9:40:14
	 */
	public static void execute(final String config, final String dbname, final File script){
		// 获取SQL脚本执行器
		SQLExec exec = getExecutor(config, dbname);
		
		// 设置脚本文件
		exec.setSrc(script);
		
		// 执行脚本
		exec.execute();
	}
	
	/**
	 * 获取SQL脚本执行器.
	 * @param config
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年9月22日 上午9:39:39
	 */
	private static SQLExec getExecutor(final String config, final String dbname){
		PropertiesUtil properties = PropertiesUtil.loader(config);
		
		SQLExec exec = new SQLExec();
		
		// 设置数据源
		exec.setUrl(getUrl(properties.getProperty("dbsm.jdbcUrl"), dbname));
		exec.setUserid(properties.getProperty("dbsm.user"));
		exec.setPassword(properties.getProperty("dbsm.password"));
		exec.setDriver(properties.getProperty("dbsm.driverClass"));
		exec.setEncoding(properties.getProperty("dbsm.encoding"));
		
		exec.setDelimiter("$");
		exec.setKeepformat(true);
		
		// 设置异常处理方式
		exec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(SQLExec.OnError.class, "abort")));
		
		// 必须指定
		exec.setProject(new Project());
		
		return exec;
	}
	
	/*
	 * 替换jdbcurl
	 */
	private static String getUrl(final String url, final String dbname){
		return url.replaceAll("\\/{1}([^\\/]*)\\?", "/"+dbname+"?");
	}
	
	public static void main(String[] args) {
		try{
			execute("/config/properties/db.properties", "miwawa_blank", new File("/Volumes/DAT/ddl.sql"));
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
